package com.xiaotao.user.enums;

import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonValue;
import lombok.Getter;


/**
 * 标签分类枚举
 */
@Getter
public enum LabelStatus {
    SUBSCRIBE(0, "subscribe", "关注"),
    RECOMMEND(1, "recommend", "推荐"),
    SUBSIDY(2, "subsidy", "国家补贴"),
    FOOD(3, "food", "美食"),
    TECHNOLOGY(4, "technology", "科技"),
    FASHION(5, "fashion", "穿搭"),
    SPORT(6, "sport", "运动"),
    OUTDOORS(7, "outdoors", "户外"),
    SKINCARE(8, "skincare", "护肤");

    @JsonValue
    int value;
    String name;
    String desc;

    LabelStatus(int value, String name, String desc) {
        this.value = value;
        this.name = name;
        this.desc = desc;
    }

    /**
     * 根据给定的整数值返回对应的LabelStatus枚举成员
     * 此方法利用JsonCreator注解，指示Jackson如何反序列化此枚举
     * 当提供的值与任何枚举成员的值匹配时，返回相应的枚举成员；否则，返回null
     *
     * @param value LabelStatus枚举成员的整数值表示
     * @return 与给定值匹配的LabelStatus枚举成员，如果找不到匹配项则返回null
     */
    @JsonCreator(mode = JsonCreator.Mode.DELEGATING)
    public static LabelStatus of(Integer value) {
        // 检查传入的值是否为null
        if (value == null) {
            return null;
        }
        // 遍历LabelStatus枚举的所有成员
        for (LabelStatus status : values()) {
            // 如果枚举成员的值与传入的值匹配，返回该枚举成员
            if (status.getValue() == value) {
                return status;
            }
        }
        // 如果没有找到匹配的枚举成员，返回null
        return null;
    }

    /**
     * 从字符串创建LabelStatus枚举实例
     * 此方法用于将字符串安全地转换为对应的枚举实例它检查输入的字符串是否与任何枚举实例的名称匹配，
     * 如果匹配，则返回该枚举实例；如果不匹配，则抛出IllegalArgumentException异常
     * 使用@JsonCreator注解是为了让Jackson库能够将JSON字符串反序列化为枚举实例
     *
     * @param name 要转换为LabelStatus枚举实例的字符串
     * @return 对应的LabelStatus枚举实例，如果找不到匹配项，则为null
     * @throws IllegalArgumentException 如果输入的字符串与任何枚举实例的名称都不匹配时抛出
     */
    @JsonCreator
    public static LabelStatus fromString(String name) {
        // 检查输入的字符串是否为null
        if (name == null) return null;

        // 遍历所有LabelStatus枚举实例
        for (LabelStatus status : values()) {
            // 检查当前枚举实例的名称是否与输入的字符串忽略大小写匹配
            if (status.name().equalsIgnoreCase(name)) {
                // 如果匹配，则返回当前枚举实例
                return status;
            }
        }

        // 如果没有找到匹配的枚举实例，则抛出IllegalArgumentException异常
        throw new IllegalArgumentException("No enum constant with name: " + name);
    }


    /**
     * 根据整数值返回对应的LabelStatus枚举类型
     * 此方法用于将整数值映射到枚举类型，以便在代码中使用更直观的枚举类型而不是原始的整数值
     * 如果找不到匹配的枚举类型，则抛出IllegalArgumentException异常
     * MyBatis requires a method to get the value for database mapping
     *
     * @param value 整数值，代表LabelStatus枚举类型的某个实例的值
     * @return 对应的LabelStatus枚举实例
     * @throws IllegalArgumentException 如果没有找到匹配的枚举实例
     */
    public static LabelStatus fromInteger(int value) {
        // 遍历LabelStatus枚举类型的每个实例
        for (LabelStatus status : values()) {
            // 检查当前枚举实例的值是否与传入的整数值相等
            if (status.getValue() == value) {
                // 如果相等，则返回当前枚举实例
                return status;
            }
        }
        // 如果没有找到匹配的枚举实例，则抛出异常
        throw new IllegalArgumentException("No matching constant for [" + value + "]");
    }
}